#pragma once

#ifdef linux
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/uio.h>
#endif

#include <errno.h>
#include <iostream>
#include <cassert>
#include <cstring>

namespace sockets
{
    int getSocketError(int sockfd);

    ssize_t write(int fd, const void* buf,size_t len);

    ssize_t read(int fd, void* buf,size_t len);

    ssize_t readv(int fd,struct iovec* vec,size_t len);

    int createNonblockingOrDie(sa_family_t family);

    int connect(int sockfd, const sockaddr_in &addr);

    void listen(int sockfd, int n = SOMAXCONN);

    int accept(int sockfd, sockaddr_in *addr);

    void bind(int sockfd, const sockaddr_in &addr);

    void shutdownWrite(int sockfd);

    void close(int sockfd);

    sockaddr_in getLocalAddr(int sockfd);

    sockaddr_in getPeerAddr(int sockfd);
}